package com.scproject.utils;

import com.scproject.scbef.exception.ProcessException;
import com.scproject.scbef.mapper.ImgMapper;
import com.scproject.scbef.mapper.ImgRelationMapper;
import com.scproject.scbef.pojo.Img;
import com.scproject.scbef.pojo.ImgRelation;
import org.codehaus.plexus.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 处理本地文件，暂时不需要了
 *
 * @author LNL
 * @date 2021/5/21 10:19
 */
public class ProcessFileUtils {


    /**
     * @param upload MultipartFile
     * @return 文件路径
     */
    //处理文件,如果处理成功，返回一个所有文件路径和文件名(UUID)
    public static Map<String,String> processFile(MultipartFile upload) {
        Map<String,String> fileData = new HashMap<>();
        //本地路径
        String filePath = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1);

        //linux路径
        //String filePath = "/data/scproject/file";
        //按照时间年-月-日的形式，将文件分层
        String extensionFolder = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String path = filePath+ "upload/" + extensionFolder + "/";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }

        //获取文件的扩展名
        String suffix = upload.getOriginalFilename().substring(upload.getOriginalFilename().lastIndexOf(".") + 1);
        //新的文件名
        String newFileName = UUIDUtils.getUUID() + "." + suffix;
        //文件的新路径
        String newFilePath = path + newFileName;
        //将文件写入到文件夹中
        try {
            upload.transferTo(new File(newFilePath));
            fileData.put("fileName",newFileName);
            fileData.put("filePath",newFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return fileData;
    }

    /**
     * 修改更新后的图片；
     * 遇到的问题，@Autowired不能注入static修改的成员变量
     * 态变量是属于类本身的信息，当类加载器加载静态变量时，
     * Spring的上下文环境还没有被加载，所以不可能为静态变量绑定值（这只是最表象原因，并不准确）。
     * 同时，Spring也不鼓励为静态变量注入值（言外之意：并不是不能注入），因为它认为这会增加了耦合度，对测试不友好。
     *
     * @param request
     * @param relationId
     * @param imgRelationMapper
     * @param imgMapper
     */
    /*public static void processUpdateFile(MultipartHttpServletRequest request,
                                         String relationId,
                                         ImgRelationMapper imgRelationMapper,
                                         ImgMapper imgMapper) {
        //先处理文件
        Map<String, String> fileData = ProcessFileUtils.processFile(request);
        try {
            if (request.getFile(REQUEST_FILE_NAME) != null) {
                //如果数据的size大于0说明操作成功了，对图片库进行操作
                if (fileData.size() > 0) {
                    //通过id查询图片基本信息,目的就是获取图片id
                    ImgRelation imgRelation = imgRelationMapper.selectByRelationId(relationId);
                    //通过查询的关联信息查询图片信息，通过图片id拿到path，删除之前的图片，
                    Img img = imgMapper.selectImg(imgRelation.getImgId());
                    if (!StringUtils.isEmpty(img.getPath())) {
                        //删除当前地址所在的图片
                        ProcessFileUtils.failDeleteFile(img.getPath());
                    }
                    //修改图片地址
                    img.setPath(fileData.get("filePath"));
                    img.setName(fileData.get("fileName"));
                    int isUpdate = imgMapper.updateByPrimaryKeySelective(img);
                    if (isUpdate == 0) {
                        //修改失败
                        ProcessFileUtils.failDeleteFile(fileData.get("filePath"));
                        throw new ProcessException("图片修改失败，请联系管理员");
                    } else {
                        fileData = ProcessFileUtils.processFile(request);
                    }
                } else {
                    ProcessFileUtils.failDeleteFile(fileData.get("filePath"));
                }
            }
        } catch (Exception e) {
            ProcessFileUtils.failDeleteFile(fileData.get("filePath"));
            throw new RuntimeException(e.getMessage());
        }
    }
*/
}
